home *** CD-ROM | disk | FTP | other *** search
- /* C-function containing inline assembler routine */
- /* for decrunching data compressed with BtoC v2.5 */
- /* or upper */
- /* Copyright © 1992-1994 by Stefano Reksten */
-
- /* To be used with GCC, linked with other sources */
-
- #include <exec/types.h>
-
- __inline BOOL
- Decrunch30(UBYTE *dest,UBYTE *source)
- {
- register BOOL d0 __asm("d0");
- register UBYTE *a0 __asm("a0") = dest;
- register UBYTE *a1 __asm("a1") = source;
- __asm ("
- moveml d1-d5/a0-a1,sp@-;
- movel a1@+,d0;
- cmpl #1112821571,d0;
- beq ok_go;
- moveq #0,d0;
- bra end;
- ok_go:
- movel a1@+,d0;
- moveb a1@+,d1;
- moveq #0,d4;
- moveb a1@+,d4;
- loop:
- cmpb a1@,d1;
- beq explode;
- moveb a1@+,a0@+;
- subl #1,d0;
- beq end;
- bra loop;
- explode:
- addl #1,a1;
- moveq #0,d2;
- moveb a1@+,d2;
- cmpb d2,d4;
- bhi else;
- subl d4,d2;
- beq skip_byt;
- moveb a1@+,d3;
- bra expl;
- skip_byt:
- moveb a1@+,d5;
- moveq #7,d2;
- moveb d1,a0@+;
- skip_loop:
- btst d2,d5;
- bne put_byte;
- moveb d1,a0@+;
- bra ok;
- put_byte:
- moveb a1@+,a0@+;
- ok:
- dbra d2,skip_loop;
- subl #9,d0;
- bra done;
- else:
- moveb d1,d3;
- expl:
- subl d2,d0;
- subb #1,d2;
- exploop:
- moveb d3,a0@+;
- dbra d2,exploop;
- done:
- tstl d0;
- beq all_done;
- bra loop;
- all_done:
- moveq #1,d0;
- end:
- moveml sp@+,d1-d5/a0-a1;
- ");
- return d0;
- }
-